﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BlogsAPI;
using VkontakteSharp;
using VkontakteSharp.Model;
using System.Globalization;

namespace VkontakteSharp.Endpoints.Newsfeeds {
    public class Authenticated : VkontakteAPI
    {
        public Authenticated(VkontakteConfig config, string authInfo) : base(config, authInfo, "/newsfeed.") { }

        /// <summary>
        /// http://vk.com/developers.php?o=-1&p=newsfeed.search
        /// </summary>
        /// <param name="q">Поисковой запрос, по которому необходимо получить результаты.</param>
        /// <param name="count">указывает, какое максимальное число записей следует возвращать, но не более 100.</param>
        /// <param name="offset">смещение, необходимое для выборки определенного подмножества результатов поиска.</param>
        /// <param name="start_time">время, в формате unixtime, начиная с которого следует получить новости для текущего пользователя. Если параметр не задан, то он считается равным значению времени, которое было сутки назад.</param>
        /// <param name="end_time">время, в формате unixtime, до которого следует получить новости для текущего пользователя. Если параметр не задан, то он считается равным текущему времени.</param>
        /// <param name="start_id">Строковый id последней полученной записи. (Возвращается в результатах запроса, для того, чтобы исключить из выборки нового запроса уже полученные записи)</param>
        /// <param name="extended">указывается 1 если необходимо получить информацию о пользователе или группе, разместившей запись. По умолчанию 0.</param>
        /// <returns></returns>
        public Response<List<Newsfeed>> Search
            (string q=null,int count=100,int offset=0,
            DateTime? start_time = null, DateTime? end_time = null, long start_id=0,
             double latitude = 0, double longitude = 0,
            bool extended=false, string version = null)
        {
            return (Response<List<Newsfeed>>)Mapper.Map<Response<List<Newsfeed>>>(
                SearchJson(q,count,offset,start_time,end_time,start_id,latitude,longitude,extended,version)
                );
        }

        /// <summary>
        /// http://vk.com/developers.php?o=-1&p=newsfeed.search
        /// </summary>
        /// <param name="q">Поисковой запрос, по которому необходимо получить результаты.</param>
        /// <param name="count">указывает, какое максимальное число записей следует возвращать, но не более 100.</param>
        /// <param name="offset">смещение, необходимое для выборки определенного подмножества результатов поиска.</param>
        /// <param name="start_time">время, в формате unixtime, начиная с которого следует получить новости для текущего пользователя. Если параметр не задан, то он считается равным значению времени, которое было сутки назад.</param>
        /// <param name="end_time">время, в формате unixtime, до которого следует получить новости для текущего пользователя. Если параметр не задан, то он считается равным текущему времени.</param>
        /// <param name="start_id">Строковый id последней полученной записи. (Возвращается в результатах запроса, для того, чтобы исключить из выборки нового запроса уже полученные записи)</param>
        /// <param name="extended">указывается 1 если необходимо получить информацию о пользователе или группе, разместившей запись. По умолчанию 0.</param>
        /// <returns></returns>
        public ResponseClass<Response5<Newsfeed>> Search5
            (string q = null, int count = 100, int offset = 0,
            DateTime? start_time = null, DateTime? end_time = null, long start_id = 0,
            double latitude = 0, double longitude = 0,
            bool extended = false, string version = null)
        {
            return (ResponseClass<Response5<Newsfeed>>)Mapper.Map<ResponseClass<Response5<Newsfeed>>>(
                SearchJson(q, count, offset, start_time, end_time, start_id, latitude, longitude, extended, version)
                );
        }

        public string SearchJson(string q = null, int count = 100, int offset = 0,
            DateTime? start_time = null, DateTime? end_time = null, long start_id = 0,
            double latitude = 0, double longitude = 0,
            bool extended = false, string version = null)
        {
            string uri = string.Format(base.Uri + "search?access_token={0}&q={1}", AuthInfo, q);
            uri += "&count=" + count;
            if(offset>0)
            {
                uri += "&offset=" + offset;
            }
            if (start_time.HasValue)
            {
                //проблема в том, что в параметре надо передавать UTC, а VK время парсится как LOCAL
                if (start_time.Value > DateTime.UtcNow)
                {
                    start_time = start_time.Value.AddHours(-4);
                }
                uri += "&start_time=" + Common.ConvertToUnixTimestamp(start_time.Value);
            }
            if (end_time.HasValue)
            {
                if (end_time.Value > DateTime.UtcNow)
                {
                    end_time = end_time.Value.AddHours(-4);
                }
                uri += "&end_time=" + Common.ConvertToUnixTimestamp(end_time.Value);
            }
            if (start_id > 0)
            {
                uri += "&start_id=" + start_id;
            }
            if (extended)
            {
                uri += "&extended=1";
            }
            if (version != null)
            {
                uri += "&v="+version;
            }
            if(latitude != 0 && longitude != 0)
            {
                 uri += string.Format(CultureInfo.GetCultureInfo("en-US"), "&latitude={0}&longitude={1}",
                latitude,
                longitude
                );
            }
            return HttpClientOld.GET(uri);
        }

    }
}
